package DAO;

import javafx.scene.Group;
import javafx.scene.control.OverrunStyle;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;

/**
 * 我的思维导图绘图板
 */
public class MyDrawPane extends ScrollPane{

    public static Group g = new Group();

    public static Pane drawPane = new Pane();

    public static ScrollPane sp = new ScrollPane();

    public MyDrawPane(){

        super(drawPane);
        drawPane.setMinWidth(1500);  // 设置drawPane的最小宽度
        drawPane.setMinHeight(1000); // 设置drawPane的最小高度
        sp = this;  //
        draw();   //初始化画图
        this.setMinHeight(585);   // 设置滚动面板的外部高度
        this.setMinWidth(900);    // 设置滚动面板的外部宽度
        this.setMaxSize(900,585); //设置滚动面板的最大大小，防止其大小变化
        this.setVvalue(0.5);      // 将初始横向滚动条置于中间
        this.setHvalue(0.5);      // 将初始纵向滚动条置于中间
        drawPane.getChildren().add(g);  // 添加自由布局板
    }

    // 绘图
    public static void draw(){
        // 清空画布
        MyDrawPane.g.getChildren().clear();

        OpRecord.insert(NodeList.list);

        for(int i=0; i<NodeList.list.size();i++){ // 为每个节点赋值
            TreeNode node = NodeList.list.get(i);
            node.setText(node.getTex());
            node.setStyle(
                     "-fx-background-color:#d6ecf0;"+
                             "-fx-background-radius:10;"+
                             "-fx-padding:10;"
            );
            node.setMaxSize(200, 80);
            node.setWrapText(true);
            node.setTextAlignment(TextAlignment.CENTER);
            node.setTextOverrun(OverrunStyle.ELLIPSIS);
            node.setTextFill(Color.BLACK);
            node.setFont(new Font("Arial",20));

            MyDrawPane.g.getChildren().add(node); // 把节点添加到画布上
            MyDrawPane.g.applyCss();  //确保更新样式
            MyDrawPane.g.layout();	//确保更新节点位置和大小

            node.setLayoutX(node.getX());
            node.setLayoutY(node.getY());

            if(node != NodeList.getRoot()) { // 如果该节点不是根节点，要进行连线
                line(node);
            }
        }
    }

    // 重绘
    public static void redraw(){
        // 清空画布
        MyDrawPane.g.getChildren().clear();

        for(int i=0; i<NodeList.list.size();i++){ // 为每个节点赋值
            TreeNode node = NodeList.list.get(i);
            node.setText(node.getTex());
            node.setStyle(
                    "-fx-background-color:#d6ecf0;"+
                            "-fx-background-radius:10;"+
                            "-fx-padding:10;"
            );
            node.setMaxSize(200, 80);
            node.setWrapText(true);
            node.setTextAlignment(TextAlignment.CENTER);
            node.setTextOverrun(OverrunStyle.ELLIPSIS);
            node.setTextFill(Color.BLACK);
            node.setFont(new Font("Arial",20));

            MyDrawPane.g.getChildren().add(node); // 把节点添加到画布上
            MyDrawPane.g.applyCss();  //确保更新样式
            MyDrawPane.g.layout();	//确保更新节点位置和大小

            node.setLayoutX(node.getX());
            node.setLayoutY(node.getY());

            if(node != NodeList.getRoot()) { // 如果该节点不是根节点，要进行连线
                line(node);
            }
        }
    }


    // 连接节点与节点之间的线
    private static void line(TreeNode node){
        TreeNode p = NodeList.getParent(node); // 获取节点的父节点
        Line line1 = new Line(); // 初始化第一条线段
        Line line2 = new Line(); // 初始化第二条线段
        Line line3 = new Line(); // 初始化第三条线段

        // 根据节点位置，设置线段的起点和终点
        if(node.getPos()==1) {
            // 设置第一条线段的起点和终点（节点与父节点顶部的连接线）
            line1.startXProperty().bind(p.layoutXProperty().add(p.widthProperty()));
            line1.startYProperty().bind(p.layoutYProperty().add(p.heightProperty().divide(2)));
            line1.endXProperty().bind((p.layoutXProperty().add(p.widthProperty().add(node.layoutXProperty()))).divide(2));
            line1.endYProperty().bind(p.layoutYProperty().add(p.heightProperty().divide(2)));

            // 设置第二条线段的起点和终点（节点与父节点中间的水平连接线）
            line2.startXProperty().bind((p.layoutXProperty().add(p.widthProperty().add(node.layoutXProperty()))).divide(2));
            line2.startYProperty().bind(p.layoutYProperty().add(p.heightProperty().divide(2)));
            line2.endXProperty().bind((p.layoutXProperty().add(p.widthProperty().add(node.layoutXProperty()))).divide(2));
            line2.endYProperty().bind(node.layoutYProperty().add(node.heightProperty().divide(2)));

            // 设置第三条线段的起点和终点（节点与父节点底部的连接线）
            line3.startXProperty().bind((p.layoutXProperty().add(p.widthProperty().add(node.layoutXProperty()))).divide(2));
            line3.startYProperty().bind(node.layoutYProperty().add(node.heightProperty().divide(2)));
            line3.endXProperty().bind(node.layoutXProperty());
            line3.endYProperty().bind(node.layoutYProperty().add(node.heightProperty().divide(2)));
        }
        else {
            // 设置第一条线段的起点和终点（节点与父节点底部的连接线）
            line1.startXProperty().bind(node.layoutXProperty().add(node.widthProperty()));
            line1.startYProperty().bind(node.layoutYProperty().add(node.heightProperty().divide(2)));
            line1.endXProperty().bind((node.layoutXProperty().add(node.widthProperty().add(p.layoutXProperty()))).divide(2));
            line1.endYProperty().bind(node.layoutYProperty().add(node.heightProperty().divide(2)));

            // 设置第二条线段的起点和终点（节点与父节点中间的水平连接线）
            line2.startXProperty().bind((node.layoutXProperty().add(node.widthProperty().add(p.layoutXProperty()))).divide(2));
            line2.startYProperty().bind(node.layoutYProperty().add(node.heightProperty().divide(2)));
            line2.endXProperty().bind((node.layoutXProperty().add(node.widthProperty().add(p.layoutXProperty()))).divide(2));
            line2.endYProperty().bind(p.layoutYProperty().add(p.heightProperty().divide(2)));

            // 设置第三条线段的起点和终点（节点与父节点顶部的连接线）
            line3.startXProperty().bind((node.layoutXProperty().add(node.widthProperty().add(p.layoutXProperty()))).divide(2));
            line3.startYProperty().bind(p.layoutYProperty().add(p.heightProperty().divide(2)));
            line3.endXProperty().bind(p.layoutXProperty());
            line3.endYProperty().bind(p.layoutYProperty().add(p.heightProperty().divide(2)));
        }

        // 设置线段的颜色和宽度
        line1.setStroke(Color.web("#d6ecf0"));
        line2.setStroke(Color.web("#d6ecf0"));
        line3.setStroke(Color.web("#d6ecf0"));
        line1.setStrokeWidth(4);
        line2.setStrokeWidth(4);
        line3.setStrokeWidth(4);

        // 将线段添加到绘图面板中显示
        MyDrawPane.g.getChildren().addAll(line1,line2,line3);
    }

}


